package com.qf.business.cart.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.business.cart.dao.CartDao;
import com.qf.business.cart.service.GoodsService;
import com.qf.entity.base.Codes;
import com.qf.entity.base.R;
import com.qf.entity.po.Cart;
import com.qf.business.cart.service.CartService;
import com.qf.entity.po.Goods;
import com.qf.entity.vo.CartInfoVo;
import com.qf.entity.vo.CartPriceJisuanVo;
import com.qf.entity.vo.CartPriceVo;
import com.qf.remote.feign.CouponServerRemote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

/**
 * 购物车表(Cart)表服务实现类
 *
 * @author makejava
 * @since 2024-02-22 14:12:02
 */
@Service("cartService")
public class CartServiceImpl extends ServiceImpl<CartDao, Cart> implements CartService {

    @Autowired
    private GoodsService goodsService;

    @Autowired
    private CouponServerRemote couponServerRemote;

    /**
     * 新增购物车
     * @param entity
     * @return
     */
    @Override
    public boolean save(Cart entity) {
        //判断当前用户的购物车中是否存在这个商品，如果不存在就新增，如果存在就数量累加
        Cart cart = this.query().eq("gid", entity.getGid()).eq("uid", entity.getUid()).one();
        if (cart == null) {
            //没有添加过这个商品
            entity.setNumber(1);
            entity.setXiaoji(0D);
            //保存购物车信息
            return super.save(entity);
        }

        //已经添加过该商品
        cart.setNumber(cart.getNumber() + 1);
        //修改购物车信息
        this.updateById(cart);
        return true;
    }

    /**
     * 查询我的购物车 同时关联查询商品信息
     * @param uid
     * @return
     */
    @Override
    public List<CartInfoVo> queryMyCarts(Integer uid) {
        List<CartInfoVo> cartInfoVos = getBaseMapper().queryMyCarts(uid);

        //动态计算小计
        for (CartInfoVo cartInfoVo : cartInfoVos) {
            double xiaoji = BigDecimal.valueOf(cartInfoVo.getPrice())
                    .multiply(BigDecimal.valueOf(cartInfoVo.getNumber()))
                    .setScale(2, RoundingMode.DOWN).doubleValue();
            cartInfoVo.setXiaoji(xiaoji);
        }

        return cartInfoVos;
    }



    /**
     * 计算总价
     * @return
     */
    @Override
    public CartPriceVo cartAllPrice(CartPriceJisuanVo cartPriceJisuanVo) {

        //根据购物车ID 把购物车集合查询出来
        List<Integer> cids = cartPriceJisuanVo.getCids();

        //原始总价
        Double allPrice = 0D;

        //循环购物车id集合
        for (Integer cid : cids) {
            //根据购物车id查询购物车信息
            Cart cart = this.getById(cid);
            //根据购物车商品id，查询商品信息
            Goods goods = goodsService.getById(cart.getGid());

            //计算小计
            BigDecimal xiaoji = BigDecimal.valueOf(goods.getPrice())
                    .multiply(BigDecimal.valueOf(cart.getNumber()))
                    .setScale(2, RoundingMode.DOWN);

            //每个购物车的小计进行累加
            allPrice = BigDecimal.valueOf(allPrice)
                    .add(xiaoji).setScale(2, RoundingMode.DOWN)
                    .doubleValue();
        }

        //TODO 通过优惠券进行优惠计算
        String couponGetId = cartPriceJisuanVo.getCouponGetId();
        if (StringUtils.hasLength(couponGetId)) {
            //如果存在优惠券领取ID，则进行优惠券的计算
            R<CartPriceVo> cartPriceVoR = couponServerRemote.useCoupon(cartPriceJisuanVo);
            if (cartPriceVoR.getCode().equals(Codes.SUCC.getCode())) {
                //券使用成功
                return cartPriceVoR.getData();
            }
        }

        CartPriceVo cartPriceVo = new CartPriceVo();
        //设置原始总价
        cartPriceVo.setAllPrice(allPrice);
        cartPriceVo.setShijiPrice(allPrice);
        cartPriceVo.setYouhuiPrice(0D);
        return cartPriceVo;
    }

    @Override
    public List<CartInfoVo> queryCartsInfoByCids(List<Integer> cids) {
        return getBaseMapper().queryCartsInfoByCids(cids);
    }
}

